import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Polynomial

# 生成虚拟数据集
np.random.seed(42)
x = np.linspace(-5, 5, 10)  # 原始数据的x坐标
y = np.sin(x) + np.random.normal(0, 0.1, len(x))  # 带噪声的y数据

# 生成高精度的插值点，用于绘制插值曲线
x_interp = np.linspace(-5, 5, 500)  # 插值后高分辨率的x坐标

# 多项式插值
degree = 9  # 多项式的阶数
coefficients = np.polyfit(x, y, degree)  # 拟合多项式的系数
poly = np.poly1d(coefficients)  # 创建多项式函数
y_interp = poly(x_interp)  # 插值后的y数据

# 计算误差：真实函数和插值函数之间的差异
true_function = np.sin(x_interp)
error = true_function - y_interp

# 创建图像
plt.figure(figsize=(12, 6))

# 图1：数据点和插值曲线
plt.subplot(1, 2, 1)
plt.scatter(x, y, color='red', label='Data points')  # 原始数据点
plt.plot(x_interp, y_interp, color='blue', label=f'Polynomial (degree {degree})')  # 插值曲线
plt.plot(x_interp, true_function, color='green', linestyle='--', label='True function')  # 真实函数
plt.title('Polynomial Interpolation')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)

# 图2：插值误差曲线
plt.subplot(1, 2, 2)
plt.plot(x_interp, error, color='purple', label='Error')
plt.axhline(0, color='black', linestyle='--')  # y=0的参考线
plt.title('Interpolation Error')
plt.xlabel('x')
plt.ylabel('Error')
plt.legend()
plt.grid(True)

# 显示图像
plt.tight_layout()
plt.show()